import Vue from 'vue'
import App from './App.vue'
import router from './router'
import ElementUI from 'element-ui'
import 'element-ui/lib/theme-chalk/index.css';
import store from './store'
import editor from './utils/wangeditor'

// axios配置与挂载
var axios = require('axios')
axios.defaults.withCredentials = true
axios.defaults.baseURL = 'http://localhost:8001/api'
axios.defaults.headers.post['Content-Type'] = 'application/x-www-form-urlencoded;charset=UTF-8';


// 添加请求拦截器
axios.interceptors.request.use((config) => {
  // 每次发送请求之前判断vuex中是否存在token
  const token = store.state.token;
  //如果存在，则统一在http请求的header都加上token，这样后台根据token判断你的登录情况
  token && (config.headers.Authorization = token);
  return config;
}, error => {
  return Promise.reject(error);
})

// 跳转登录页, 并将要浏览的页面fullPath传过去，登录成功后跳转需要访问的页面
const toLogin = () => {
  router.replace({
    path: '/userLogin',
    query: {
      redirect: router.currentRoute.fullPath
    }
  });
}

const toNotFound = () => {
    router.replace({
      path: '/notfound',
      query: {
        redirect: router.currentRoute.fullPath
      }
    });
}

// 添加响应拦截器
axios.interceptors.response.use(
  response => {
    let jsonString = JSON.stringify(response.data);
    let jsonObj = JSON.parse(jsonString);
    if(jsonObj.success) {
      return Promise.resolve(response);
    } else {
      switch (jsonObj.code) {
        case 201:  // 默认失败，出现大问题
        case 4000: // 404页面，渲染失败
          alert(jsonObj.message);
          toNotFound();
          break;
        case 3000:
        case 3001:
        case 3002:
        case 4001:
          alert(jsonObj.message);
          break;
          // 以下的四种直接在login_page.vue中进行弹窗提醒
        case 2001:
        case 2003:
        case 2007:
        case 2008:
          break;
        case 401:   //    权限不足，返回登录界面
          toLogin();
          break;
        case 403:   // token过期，登录过期对用户进行提示
          Message.error({message: '登录过期，请重新登录', duration: 1000})
          localStorage.removeItem('token');  // 清除token
          store.commit('loginSuccess', null);
          toLogin();
          break;
        case 404:  // 找不到，请求路径错误
          Message.error({message: '请求路径错误', duration: 1000});
          toNotFound();
          break;
        case 500:  // 服务器出现异常
          Message.error({message: '服务器出现异常', duration: 1000});
          setTimeout(() => {
            router.replace({
              path: '/500error',
              query: {
                redirect: router.currentRoute.fullPath
              }
            });
          }, 1000);
          break;
      }
      return Promise.resolve(response);
    }
  },
  error => {
    if(error.response.status) {
      switch (error.response.status) {
        case 401:   //    权限不足，返回登录界面
          toLogin();
          break;
        case 403:   // token过期，登录过期对用户进行提示
          Message.error({message: '登录过期，请重新登录', duration: 1000})
          localStorage.removeItem('token');  // 清除token
          store.commit('loginSuccess', null);
          toLogin();
          break;
        case 404:  // 找不到，请求路径错误
          Message.error({message: '请求路径错误', duration: 1000});
          toNotFound();
          break;
        case 500:  // 服务器出现异常
          Message.error({message: '服务器出现异常', duration: 1000});
          setTimeout(() => {
            router.replace({
              path: '/500error',
              query: {
                redirect: router.currentRoute.fullPath
              }
            });
          }, 1000);
          break;
      }
      return Promise.reject(error.response);
    } else {
      // 处理断网的情况
      store.commit('changeNetwork', false);
    }
  }
);

Vue.prototype.$axios = axios

// wangeditor挂载
Vue.prototype.$editor = editor

Vue.config.productionTip = false

Vue.use(ElementUI)

new Vue({
  router,
  store,
  render: h => h(App)
}).$mount('#app')


